package main

import (
	"time"
	"fmt"
)

func main() {

	// 使用select可以解决从管道取数据的阻塞问题

	// 1. 定义一个管道 10个数据int
	intChan := make(chan int, 10)
	for i := 0; i < 10; i++ {
		intChan <- i
	}

	// 2. 定义一个管道 5个数据string
	stringChan := make(chan string, 5)
	for i := 0; i < 5; i++ {
		stringChan <- "hello" + fmt.Sprintf("%d", i)
	}

	// 传统的方法在遍历管道时，如果不关闭会阻塞导致死锁

	// 在实际开发中，我们可能不好确定什么时候关闭管道
	// 可以使用select解决
	label:
	for {
		select {
		case v := <- intChan:  // 如果管道一直没有关闭，也不会阻塞再这里而死锁。他会自动地到写一个case里面匹配
			fmt.Printf("从intChan读取了数据%d\n", v)
			time.Sleep(time.Second)
		case v := <- stringChan:
			fmt.Printf("从stringChan读取了数据%s\n", v)
			time.Sleep(time.Second)
		default:
			fmt.Println("都取不到了")
			time.Sleep(time.Second)
			break label
		}
	}



}